package com.sojson.project.entity.po;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sojson.base.impl.BaseDto;
import com.sojson.enums.core.ECouponStatus;
import com.sojson.util.DateUtil;
import com.sojson.util.id.IdUtil;
import com.sojson.util.token.TokenUtil;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiModelProperty.AccessMode;

/**
 * 优惠券Bean
 * 
 * @author liu
 * @date 2021-03-24
 */
@ApiModel("优惠券Bean")
public class Coupon extends BaseDto {

    /**
     * 此文件由工具自动生成，手动添加内容请放至末尾
     */

    private static final long serialVersionUID = 1616573744465L;

    @ApiModelProperty("优惠券编号")
    private String no;
    @ApiModelProperty("发放用户编号")
    private String userNo;
    @ApiModelProperty("批次编号")
    private String batchNo;
    @ApiModelProperty("优惠券名称")
    private String name;
    @ApiModelProperty("券类型(1:定额立减券,2:随机立减券,3:折扣立减券)")
    private Integer type;
    @ApiModelProperty("券使用范围类型(1:通用券,2.自定义范围券,3:,特定模块券,4:特定店铺券,5:特定商品券)")
    private Integer typeScope;
    @ApiModelProperty("模块使用范围(1:所有模块可用,2:特定模块可用,3:某些模块可用,4:某些模块不可用)")
    private Integer scopeModule;
    @ApiModelProperty("店铺使用范围(1:所有店铺可用,2:特定店铺可用,3:某些店铺可用,4:某些店铺不可用)")
    private Integer scopeStore;
    @ApiModelProperty("商品使用范围(1:所有商品可用,2:特定商品可用,3:某些商品可用,4:某些商品不可用)")
    private Integer scopeGoods;
    @ApiModelProperty("用户使用范围(1:所有用户可用,2:特定用户可用,3:某些用户可用,4:某些用户不可用)")
    private Integer scopeUser;
    @ApiModelProperty("使用模块编号")
    private String useModuleNo;
    @ApiModelProperty("使用店铺编号")
    private String useStoreNo;
    @ApiModelProperty("使用商品编号")
    private String useGoodsNo;
    @ApiModelProperty("使用用户编号")
    private String useUserNo;
    @ApiModelProperty("优惠方式(1:定额立减,2:随机立减,3:折扣立减)")
    private Integer reducedMethod;
    @ApiModelProperty("领取方式(1:领券中心领取,2:活动领取,3:模块页面领取,4:店铺页面领取,5:商品详情页面领取,6:直接投放)")
    private String getMethod;
    @ApiModelProperty("营销经费(1:预充值,使用本商户号余额,商户订单实收不变,2:免充值,扣减商户订单实收金额)")
    private Integer chargeMethod;
    @ApiModelProperty("优惠券状态(1:未生效(未投放),2:已生效(已投放),3:已暂停(不能领取),4:已冻结(不能领取,不能使用,可解冻),5:已失效(不能解冻))")
    private Integer status;
    @ApiModelProperty("是否设置总预算金额(1:是,2:否)")
    private Integer isBudget;
    @ApiModelProperty("总预算金额(单位:元)")
    private BigDecimal budget;
    @ApiModelProperty("是否设置单天预算消耗上限(1:是,2:否)")
    private Integer isBudgetDay;
    @ApiModelProperty("单天预算消耗上限金额(单位:元)")
    private BigDecimal budgetDay;
    @ApiModelProperty("使用门槛(单位:元,金额以上可用)")
    private BigDecimal doorsill;
    @ApiModelProperty("满减金额(单位:元)")
    private BigDecimal price;
    @ApiModelProperty("随机立减开始区间(单位:元)")
    private BigDecimal randomStart;
    @ApiModelProperty("随机立减结束区间(单位:元)")
    private BigDecimal randomEnd;
    @ApiModelProperty("折扣(1-99,88为8.8折)")
    private Integer discount;
    @ApiModelProperty("是否设置折扣单笔优惠上限(1:是,2:否)")
    private Integer isDiscountCeiling;
    @ApiModelProperty("折扣单笔优惠上限(单位:元)")
    private BigDecimal discountCeiling;
    @ApiModelProperty("发放数量")
    private Integer number;
    @ApiModelProperty("可用时间规则(1:有效期内,任意时段可用,2:有效期内,规则日期可用,3:有效期内,不规则日期可用)")
    private Integer dateType;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JSONField(format = "yyyy-MM-dd")
    @ApiModelProperty("可用开始时间")
    private Date startDate;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JSONField(format = "yyyy-MM-dd")
    @ApiModelProperty("可用结束时间")
    private Date endDate;
    @ApiModelProperty("同时使用(1:该优惠可以和其他类型优惠同时使用,2:该优惠不可以和其他类型优惠同时使用)")
    private Integer isTogetherUse;
    @ApiModelProperty("创建时间")
    private Date createdAt;
    @ApiModelProperty("更新时间")
    private Date updatedAt;
    @ApiModelProperty("优惠券集合")
    private List<Integer> ids;
    @ApiModelProperty("优惠券编号集合")
    private List<String> nos;
    @ApiModelProperty(value = "模块使用范围集合", accessMode = AccessMode.READ_ONLY)
    private List<String> moduleNos;
    @ApiModelProperty(value = "店铺使用范围集合", accessMode = AccessMode.READ_ONLY)
    private List<String> storeNos;
    @ApiModelProperty(value = "商品使用范围集合", accessMode = AccessMode.READ_ONLY)
    private List<String> goodsNos;
    @ApiModelProperty(value = "用户使用范围集合", accessMode = AccessMode.READ_ONLY)
    private List<String> userNos;
    @ApiModelProperty(value = "领取范围集合", accessMode = AccessMode.READ_ONLY)
    private List<CouponGetMethod> scopeNos;
    /** 优惠券集合 */
    private List<Coupon> coupons;

    /**
     * 以上由工具自动生成，以下为手动添加
     */

       /**
        * Empty constructor
        */
    public Coupon() {

    }

    /**
     * 此文件由工具自动生成，手动添加内容请放至末尾
     */

    /**
     * 获取 优惠券编号
     */
    @Override
    public String getNo() {
        return no;
    }

    /**
     * 设置 优惠券编号
     */
    @Override
    public void setNo(String no) {
        this.no = no;
    }

    /**
     * 获取发放用户编号
     */
    public String getUserNo() {
        return userNo;
    }

    /**
     * 设置发放用户编号
     */
    public void setUserNo(String userNo) {
        this.userNo = userNo;
    }

    /**
     * 获取 批次编号
     */
    public String getBatchNo() {
        return batchNo;
    }

    /**
     * 设置 批次编号
     */
    public void setBatchNo(String batchNo) {
        this.batchNo = batchNo;
    }

    /**
     * 获取 优惠券名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置 优惠券名称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取 券类型(1:定额立减券,2:随机立减券,3:折扣立减券)
     */
    public Integer getType() {
        return type;
    }

    /**
     * 设置 券类型(1:定额立减券,2:随机立减券,3:折扣立减券)
     */
    public void setType(Integer type) {
        this.type = type;
    }

    /**
     * 获取 券使用范围类型(1:通用券,2.自定义范围券,3:,特定模块券,4:特定店铺券,5:特定商品券)
     */
    public Integer getTypeScope() {
        return typeScope;
    }

    /**
     * 设置 券使用范围类型(1:通用券,2.自定义范围券,3:,特定模块券,4:特定店铺券,5:特定商品券)
     */
    public void setTypeScope(Integer typeScope) {
        this.typeScope = typeScope;
    }

    /**
     * 获取 模块使用范围(1:所有模块可用,2:特定模块可用,3:某些模块可用,4:某些模块不可用)
     */
    public Integer getScopeModule() {
        return scopeModule;
    }

    /**
     * 设置 模块使用范围(1:所有模块可用,2:特定模块可用,3:某些模块可用,4:某些模块不可用)
     */
    public void setScopeModule(Integer scopeModule) {
        this.scopeModule = scopeModule;
    }

    /**
     * 获取 店铺使用范围(1:所有店铺可用,2:特定店铺可用,3:某些店铺可用,4:某些店铺不可用)
     */
    public Integer getScopeStore() {
        return scopeStore;
    }

    /**
     * 设置 店铺使用范围(1:所有店铺可用,2:特定店铺可用,3:某些店铺可用,4:某些店铺不可用)
     */
    public void setScopeStore(Integer scopeStore) {
        this.scopeStore = scopeStore;
    }

    /**
     * 获取 商品使用范围(1:所有商品可用,2:特定商品可用,3:某些商品可用,4:某些商品不可用)
     */
    public Integer getScopeGoods() {
        return scopeGoods;
    }

    /**
     * 设置 商品使用范围(1:所有商品可用,2:特定商品可用,3:某些商品可用,4:某些商品不可用)
     */
    public void setScopeGoods(Integer scopeGoods) {
        this.scopeGoods = scopeGoods;
    }

    /**
     * 获取 用户使用范围(1:所有用户可用,2:特定用户可用,3:某些用户可用,4:某些用户不可用)
     */
    public Integer getScopeUser() {
        return scopeUser;
    }

    /**
     * 设置 用户使用范围(1:所有用户可用,2:特定用户可用,3:某些用户可用,4:某些用户不可用)
     */
    public void setScopeUser(Integer scopeUser) {
        this.scopeUser = scopeUser;
    }

    /**
     * 获取 使用模块编号
     */
    public String getUseModuleNo() {
        return useModuleNo;
    }

    /**
     * 设置 使用模块编号
     */
    public void setUseModuleNo(String useModuleNo) {
        this.useModuleNo = useModuleNo;
    }

    /**
     * 获取 使用店铺编号
     */
    public String getUseStoreNo() {
        return useStoreNo;
    }

    /**
     * 设置 使用店铺编号
     */
    public void setUseStoreNo(String useStoreNo) {
        this.useStoreNo = useStoreNo;
    }

    /**
     * 获取 使用商品编号
     */
    public String getUseGoodsNo() {
        return useGoodsNo;
    }

    /**
     * 设置 使用商品编号
     */
    public void setUseGoodsNo(String useGoodsNo) {
        this.useGoodsNo = useGoodsNo;
    }

    /**
     * 获取 使用用户编号
     */
    public String getUseUserNo() {
        return useUserNo;
    }

    /**
     * 设置 使用用户编号
     */
    public void setUseUserNo(String useUserNo) {
        this.useUserNo = useUserNo;
    }

    /**
     * 获取 优惠方式(1:定额立减,2:随机立减,3:折扣立减)
     */
    public Integer getReducedMethod() {
        return reducedMethod;
    }

    /**
     * 设置 优惠方式(1:定额立减,2:随机立减,3:折扣立减)
     */
    public void setReducedMethod(Integer reducedMethod) {
        this.reducedMethod = reducedMethod;
    }

    /**
     * 获取 领取方式(1:领券中心领取,2:活动领取,3:模块页面领取,4:店铺页面领取,5:商品详情页面领取,6:直接投放)
     */
    public String getGetMethod() {
        return getMethod;
    }

    /**
     * 设置 领取方式(1:领券中心领取,2:活动领取,3:模块页面领取,4:店铺页面领取,5:商品详情页面领取,6:直接投放)
     */
    public void setGetMethod(String getMethod) {
        this.getMethod = getMethod;
    }

    /**
     * 获取 营销经费(1:预充值,使用本商户号余额,商户订单实收不变,2:免充值,扣减商户订单实收金额)
     */
    public Integer getChargeMethod() {
        return chargeMethod;
    }

    /**
     * 设置 营销经费(1:预充值,使用本商户号余额,商户订单实收不变,2:免充值,扣减商户订单实收金额)
     */
    public void setChargeMethod(Integer chargeMethod) {
        this.chargeMethod = chargeMethod;
    }

    /**
     * 获取 优惠券状态(1:未生效(未投放),2:已生效(已投放),3:已暂停(不能领取),4:已冻结(不能领取,不能使用,可解冻),5:已失效(不能解冻))
     */
    public Integer getStatus() {
        return status;
    }

    /**
     * 设置 优惠券状态(1:未生效(未投放),2:已生效(已投放),3:已暂停(不能领取),4:已冻结(不能领取,不能使用,可解冻),5:已失效(不能解冻))
     */
    public void setStatus(Integer status) {
        this.status = status;
    }

    /**
     * 获取 是否设置总预算金额(1:是,2:否)
     */
    public Integer getIsBudget() {
        return isBudget;
    }

    /**
     * 设置 是否设置总预算金额(1:是,2:否)
     */
    public void setIsBudget(Integer isBudget) {
        this.isBudget = isBudget;
    }

    /**
     * 获取 总预算金额(单位:元)
     */
    public BigDecimal getBudget() {
        return budget;
    }

    /**
     * 设置 总预算金额(单位:元)
     */
    public void setBudget(BigDecimal budget) {
        this.budget = budget;
    }

    /**
     * 获取 是否设置单天预算消耗上限(1:是,2:否)
     */
    public Integer getIsBudgetDay() {
        return isBudgetDay;
    }

    /**
     * 设置 是否设置单天预算消耗上限(1:是,2:否)
     */
    public void setIsBudgetDay(Integer isBudgetDay) {
        this.isBudgetDay = isBudgetDay;
    }

    /**
     * 获取 单天预算消耗上限金额(单位:元)
     */
    public BigDecimal getBudgetDay() {
        return budgetDay;
    }

    /**
     * 设置 单天预算消耗上限金额(单位:元)
     */
    public void setBudgetDay(BigDecimal budgetDay) {
        this.budgetDay = budgetDay;
    }

    /**
     * 获取 使用门槛(单位:元,金额以上可用)
     */
    public BigDecimal getDoorsill() {
        return doorsill;
    }

    /**
     * 设置 使用门槛(单位:元,金额以上可用)
     */
    public void setDoorsill(BigDecimal doorsill) {
        this.doorsill = doorsill;
    }

    /**
     * 获取 满减金额(单位:元)
     */
    public BigDecimal getPrice() {
        return price;
    }

    /**
     * 设置 满减金额(单位:元)
     */
    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    /**
     * 获取 随机立减开始区间(单位:元)
     */
    public BigDecimal getRandomStart() {
        return randomStart;
    }

    /**
     * 设置 随机立减开始区间(单位:元)
     */
    public void setRandomStart(BigDecimal randomStart) {
        this.randomStart = randomStart;
    }

    /**
     * 获取 随机立减结束区间(单位:元)
     */
    public BigDecimal getRandomEnd() {
        return randomEnd;
    }

    /**
     * 设置 随机立减结束区间(单位:元)
     */
    public void setRandomEnd(BigDecimal randomEnd) {
        this.randomEnd = randomEnd;
    }

    /**
     * 获取 折扣(1-99,88为8.8折)
     */
    public Integer getDiscount() {
        return discount;
    }

    /**
     * 设置 折扣(1-99,88为8.8折)
     */
    public void setDiscount(Integer discount) {
        this.discount = discount;
    }

    /**
     * 获取 是否设置折扣单笔优惠上限(1:是,2:否)
     */
    public Integer getIsDiscountCeiling() {
        return isDiscountCeiling;
    }

    /**
     * 设置 是否设置折扣单笔优惠上限(1:是,2:否)
     */
    public void setIsDiscountCeiling(Integer isDiscountCeiling) {
        this.isDiscountCeiling = isDiscountCeiling;
    }

    /**
     * 获取 折扣单笔优惠上限(单位:元)
     */
    public BigDecimal getDiscountCeiling() {
        return discountCeiling;
    }

    /**
     * 设置 折扣单笔优惠上限(单位:元)
     */
    public void setDiscountCeiling(BigDecimal discountCeiling) {
        this.discountCeiling = discountCeiling;
    }

    /**
     * 获取 发放数量
     */
    public Integer getNumber() {
        return number;
    }

    /**
     * 设置 发放数量
     */
    public void setNumber(Integer number) {
        this.number = number;
    }

    /**
     * 获取 可用时间规则(1:有效期内,任意时段可用,2:有效期内,规则日期可用,3:有效期内,不规则日期可用)
     */
    public Integer getDateType() {
        return dateType;
    }

    /**
     * 设置 可用时间规则(1:有效期内,任意时段可用,2:有效期内,规则日期可用,3:有效期内,不规则日期可用)
     */
    public void setDateType(Integer dateType) {
        this.dateType = dateType;
    }

    /**
     * 获取 可用开始时间
     */
    public Date getStartDate() {
        return startDate;
    }

    /**
     * 设置 可用开始时间
     */
    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    /**
     * 获取 可用结束时间
     */
    public Date getEndDate() {
        return endDate;
    }

    /**
     * 设置 可用结束时间
     */
    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    /**
     * 获取 同时使用(1:该优惠可以和其他类型优惠同时使用,2:该优惠不可以和其他类型优惠同时使用)
     */
    public Integer getIsTogetherUse() {
        return isTogetherUse;
    }

    /**
     * 设置 同时使用(1:该优惠可以和其他类型优惠同时使用,2:该优惠不可以和其他类型优惠同时使用)
     */
    public void setIsTogetherUse(Integer isTogetherUse) {
        this.isTogetherUse = isTogetherUse;
    }

    /**
     * 获取 创建时间
     */
    public Date getCreatedAt() {
        return createdAt;
    }

    /**
     * 设置 创建时间
     */
    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    /**
     * 获取 更新时间
     */
    public Date getUpdatedAt() {
        return updatedAt;
    }

    /**
     * 设置 更新时间
     */
    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }

    /**
     * 获取 优惠券集合
     */
    public List<Integer> getIds() {
        return ids;
    }

    /**
     * 设置 优惠券集合
     */
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    /**
     * 获取 优惠券编号集合
     */
    public List<String> getNos() {
        return nos;
    }

    /**
     * 设置 优惠券编号集合
     */
    public void setNos(List<String> nos) {
        this.nos = nos;
    }

    /**
     * 获取 优惠券集合
     */
    public List<Coupon> getCoupons() {
        return coupons;
    }

    /**
     * 设置 优惠券集合
     */
    public void setCoupons(List<Coupon> coupons) {
        this.coupons = coupons;
    }

    /**
     * 以上由工具自动生成，以下为手动添加
     */

    /**
     * 获取模块使用范围集合
     * 
     * @return
     */
    public List<String> getModuleNos() {
        return moduleNos;
    }

    /**
     * 设置模块使用范围集合
     * 
     * @param moduleNos
     */
    public void setModuleNos(List<String> moduleNos) {
        this.moduleNos = moduleNos;
    }

    /**
     * 获取店铺使用范围集合
     * 
     * @return
     */
    public List<String> getStoreNos() {
        return storeNos;
    }

    /**
     * 设置店铺使用范围集合
     * 
     * @param storeNos
     */
    public void setStoreNos(List<String> storeNos) {
        this.storeNos = storeNos;
    }

    /**
     * 获取商品使用范围集合
     * 
     * @return
     */
    public List<String> getGoodsNos() {
        return goodsNos;
    }

    /**
     * 设置商品使用范围集合
     * 
     * @param goodsNos
     */
    public void setGoodsNos(List<String> goodsNos) {
        this.goodsNos = goodsNos;
    }

    /**
     * 获取用户使用范围集合
     * 
     * @return
     */
    public List<String> getUserNos() {
        return userNos;
    }

    /**
     * 设置用户使用范围集合
     * 
     * @param userNos
     */
    public void setUserNos(List<String> userNos) {
        this.userNos = userNos;
    }

    /**
     * 获取领取范围集合
     * 
     * @return
     */
    public List<CouponGetMethod> getScopeNos() {
        return scopeNos;
    }

    /**
     * 设置领取范围集合
     * 
     * @param scopeNos
     */
    public void setScopeNos(List<CouponGetMethod> scopeNos) {
        this.scopeNos = scopeNos;
    }

    /**
     * 插入初始化
     * @throws IOException 
     */
    public void insertInit() throws IOException {
        setNo(IdUtil.uuid());
        setUserNo(TokenUtil.getUserId());
        setBatchNo(IdUtil.uuid());
        setStatus(ECouponStatus.YES_LAUNCH.getCode());
        Date now = DateUtil.nowDate();
        setCreatedAt(now);
        setUpdatedAt(now);
    }

    /**
     * 更新初始化
     */
    public void updateInit() {
        Date now = DateUtil.nowDate();
        setUpdatedAt(now);
    }

    /**
     * 更新初始化
     */
    public void setUpdateNull() {
        setNo(null);
        setBatchNo(null);
        setUserNo(null);
        setBatchNo(null);
        setNumber(null);
        setStartDate(null);
        setEndDate(null);
    }

}